
上圖為官網所繪製的Instance Lifecycle(生命週期),Vue其實在我們下執行命令後,會做很多事情,因為它將資料(data)與UI樣板(template)綁在一起,開發者只需要宣告好資料、填入正確的UI components以及router的path設定好後,結果就會呈現。
而在我們執行後,Vue在這個Lifecycle中,會建立Vue Instance、綁定資料、事件配置、編譯樣板、經過無限修改更新資料等步驟,直到整個Vue Instance被銷毀(destroyed),這個Vue Instance底下的資料、樣板、事件、元件才會解除綁定,完成一整個Lifecycle。
那什麼是Instance Lifecycle Hooks(生命週期鉤子)呢?看到上面的Lifecycle diagram,鉤子就是上圖虛線延伸出去白底紅字的8個方法,這些鉤子的用意是在Vue在Lifecycle中做每件事情的時機點前後,可以讓你有選擇處理的方式,相當客製化。
這8個鉤子的資料型態皆為function,以下我們就介紹這8個鉤子分別可以使用的時機
在初始化vue instance並開啟整個Lifecycle後,資料綁定與事件配置之前。目前階段還無法調用$data。
應用場景:loading進頁面的事件
vue instance創建完成,$data已可以取得,屬性與事件也已綁定好。目前階段尚未掛載el,DOM也尚未生成。
在掛載el開始之前。目前階段是相關render函式首次被調用,尚未被DOM給綁定。
el被剛創建好的vm.$el替換取代,並且掛載到vm上。目前階段已被DOM綁定。
應用場景:對後端發出請求或讀取新資料
在資料更新時調用,Virtual DOM重新render與patch之前,可以在這個階段變更資料狀態。目前階段還不會繪製view。
資料更新後會使Virtual DOM重新render頁面。目前階段會繪製出正確的view。
在vue instance被銷毀前調用。目前階段還可以完全使用這個vue instance。
vue instance銷毀後可以調用,調用後這個vue instance底下的資料與樣板會解除綁定,事件會取消監聽,所有子元件也會被銷毀。
var vm = new Vue({
    data: {
        name: 'Eva',
    },
    beforeCreate: function() {
        // vue instance尚未創建完成,還不能讀取到資料
        console.log('beforeCreate: My name is ' + this.name);
    },
    created: function() {
        // vue instance創建完成,資料已綁定
        console.log('created: My name is ' + this.name);
    },
    beforeMount: function() {
        // 尚未掛載el與綁定DOM
        console.log('beforeMount: My name is ' + this.name);
    },
    mounted: function() {
        // 綁定DOM之後
        console.log('mounted: My name is ' + this.name);
    },
    beforeUpdate: function() {
        // 資料更新時調用,尚未更新DOM
        console.log('beforeUpdate: My name is ' + this.name);
    },
    updated: function() {
        // 因為資料更新而更新DOM
        console.log('updated: My name is ' + this.name);
    },
    beforeDestroy: function() {
        // 銷毀整個vue instance之前
        console.log('beforeDestroy');
    },
    destroyed: function() {
        // 銷毀整個vue instance之後
        console.log('destroyed');
    },
});
我們分四階段來看
在綁定el之前,beforeCreate階段還不能讀取資料

在程式碼下面加入這行程式碼
vm.$mount('#app');
或者加入el屬性在物件裡
var vm = new Vue({
  el: '#app',
  data: {
    name: 'Eva',
  },
  ...
});

因為要變更資料才會觸發這兩個function,這邊我們使用強制變更資料
vm.$forceUpdate();

因為上面第三階段強制變更資料的方法會導致一直執行更新資料,所以先將剛剛新增的vm.$forceUpdate();刪掉,加入destroy的方法
vm.$destroy();

總結來說,從Lifecycle可以觀察得出Vue的執行順序,對於Vue在執行後並顯示出結果的流程會比較熟悉。